package starkuz.smartpages.model;

import java.util.*;

/**
 * любой тег (div, form, input и т. д.), может содержать вложенные теги
 */
public class Tag implements Comparable {

    public Tag(Long id, Long pageId, Long parentId, String name, String value) {
        this.id = id;
        this.pageId = pageId;
        this.parentId = parentId;
        this.name = name;
        this.value = value;
        this.attributes = new LinkedList<Attribute>();
        this.tags = new TreeSet<Tag>();
    }

    public Tag() {
        this.attributes = new LinkedList<Attribute>();
        this.tags = new TreeSet<Tag>();
    }

    private Long id;
    private Long pageId;   //null если тег принадлежит виджету(корневому тегу) или другому тегу
    private Long parentId; //null если это айди виджета(корневого тега)
    private String name;
    private String value; //текст внутри тега, сели нет вложенныъ тегов
    private Collection<Attribute> attributes; //в базе будет храниться как строка пар, разделенных "&" и "="
    private Collection<Tag> tags; //вложенные в данный тег теги

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getPageId() {
        return pageId;
    }

    public void setPageId(Long pageId) {
        this.pageId = pageId;
    }

    public Long getParentId() {
        return parentId;
    }

    public void setParentId(Long parentId) {
        this.parentId = parentId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Collection<Attribute> getAttributes() {
        return attributes;
    }

    public Collection<Tag> getTags() {
        return tags;
    }

    public void setTags(Collection<Tag> tags) {
        this.tags = tags;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        if (tags.isEmpty()) {
            this.value = value;
        } else return;
    }

    //добавление одного тега
    public void addTag(Tag tag) {
        value = null; //при добавлении тега внутрь текст внутри тега удаляем
        this.tags.add(tag);
    }

    //удаление одного тега
    public void removeTag(Tag tag) {
        this.tags.remove(tag);
    }

    //установка атрибутов из списка
    public void setAttributes(Collection<Attribute> attributes) {
        this.attributes = attributes;
    }

    //установка атрибутов через строку из БД
    public void setAttributes(String attrs) {
        this.attributes = stringToAttrs(attrs);
    }

    //перевод строки в список атрибутов
    public LinkedList<Attribute> stringToAttrs(String str){
        LinkedList<Attribute> attrs = new LinkedList<Attribute>();
        String[] pairs = str.split("&");
        for (String pair : pairs)
        {
            String[] attr = pair.split("=");
            Attribute attribute = new Attribute(attr[0], attr[1]);
            attrs.add(attribute);
        }
        return attrs;
    }

    //перевод атрибутов в строку для хранения в БД
    public  String listAttrsToString(LinkedList<Attribute> attrs){
        StringBuilder sb = new StringBuilder();
        for (Attribute attr : attrs){
            sb.append(attr.getName());
            sb.append("=");
            sb.append(attr.getValue());
            sb.append("&");
        }
        return sb.substring(0,sb.length()-1);
    }

    //теги отличаются друг от друга айдишниками
    public boolean equals(Object obj) {
        Tag tag = (Tag)obj;
        if (id==tag.getId()) {
            return true;
        }
        return false;
    }

    //теги отличаются друг от друга айдишниками
    @Override
    public int compareTo(Object o) {
        Tag tag = (Tag)o;
        return id.compareTo(tag.getId());
    }
}
